# @Time    : 2021/8/2 11:00
import sys
import time
import datetime


def get_str_to_timestamp(s):
    """把字符串转换成时间戳

    Args:
        s (String): like "2019-5-10 23:40:00"

    Returns:
        _type_: timeStamp 时间戳
    """
    timeArray  = time.strptime(s, "%Y-%m-%d %H:%M:%S")
    timeStamp = int(time.mktime(timeArray))
    return timeStamp


def get_time_difference(t1, t2):
    s = datetime.datetime.strptime(str(t1), '%Y-%m-%d %H:%M:%S')
    n = datetime.datetime.strptime(str(t2), '%Y-%m-%d %H:%M:%S')
    d = n - s
    return d.seconds


def get_hour():
    """
    获取当前系统的当前时间：小时数（24小时制）
    :return: 14
    """
    hour = datetime.datetime.now().hour
    return hour


def get_minute():
    """
    获取当前系统的当前时间：分钟数
    :return: 28
    """
    minute = datetime.datetime.now().minute
    return minute


def get_timestamp():
    """
    获取当前系统的当前时间戳格式的时间，返回的类型为int
    :return: 1533104393
    """
    now = time.time()
    return int(now)


def get_date2timestamp(date):
    """
    将日期转换为对应日期的0点的时间戳
    :param date:
    :return: 1533052800
    """
    time_array = time.strptime(str(date), "%Y-%m-%d")
    timestamp = int(time.mktime(time_array))
    return timestamp


def timestamp_day_num_start(num=0):
    """
    换算出相对时间的当日开始时间的时间戳
    :param num:
    :return: 1533052800（2018-08-01 00:00:00）
    """
    return get_date2timestamp(get_relative_date(-num))


def timestamp_day_num_end(num=0):
    """
    换算出相对时间的当日结束时间的时间戳
    :param num:
    :return: 1533139199（2018-08-01 23:59:59）
    """
    return get_date2timestamp(get_relative_date(-num - 1)) - 1


def datetime_to_str(datetime_type):
    """
    将datetime.datetime(2021, 8, 13, 10, 40, 41)类型转为2021-08-13 10:40:41
    :return: 时间格式字符串
    """
    datetime_str = datetime_type.strftime('%Y-%m-%d %H:%M:%S')
    return datetime_str


def datetime_to_timestamp(datetime_type):
    """
    将datetime.datetime(2021, 8, 13, 10, 40, 41)类型转为时间戳
    :return: 时间戳
    """
    timestamp = datetime_type.timestamp()
    return int(timestamp)


def timestamp_to_datetime(timestamp):
    """
    将时间戳转换为datetime时间
    :param timestamp:
    :return: 2018-08-01 14:19:53
    """
    time_array = time.localtime(timestamp)
    date_time = time.strftime("%Y-%m-%d %H:%M:%S", time_array)
    return date_time


def get_current_time_str_file_name():
    """
    获取当前系统的当前时间格式的时间，适用于命名文件
    :return: 2018-08-01 141854
    """
    now = datetime.datetime.now()
    data_time = now.strftime('%Y-%m-%d %H%M%S')
    return data_time


def get_current_time_str():
    """
    获取当前系统的当前时间格式的时间，精确到秒
    :return: 2018-08-01 14:18:31
    """
    now = datetime.datetime.now()
    date_time = now.strftime('%Y-%m-%d %H:%M:%S')
    return date_time


def get_relative_start_time(num=0):
    """
    换算出相对时间的当日开始时间的时间
    :param num:
    :return: 2018-08-01 00:00:00
    """
    now = datetime.datetime.now()
    return now - datetime.timedelta(days=num, hours=now.hour, minutes=now.minute, seconds=now.second,
                                    microseconds=now.microsecond)


def get_relative_start_time_str(num=0):
    """
    换算出相对时间的当日开始时间的时间字符串
    :param num:
    :return: 2018-08-01 00:00:00
    """
    return get_relative_start_time(num).strftime('%Y-%m-%d %H:%M:%S')


def get_relative_date(num=0):
    """
    获取当前系统当前时间的相对时间：日期，num为0表示当日，num为正数表示向历史推算的天数，num为负数表示向未来推算的天数
    :param num:
    :return: 2018-08-01
    """
    today = datetime.date.today()
    date = today + datetime.timedelta(days=-num)
    return date


def get_relative_date_str(num=0):
    """
    获取当前系统当前时间的相对时间：日期，num为0表示当日，num为正数表示向历史推算的天数，num为负数表示向未来推算的天数
    :param num:
    :return: 2018-08-01
    """
    return get_relative_date(num).strftime('%Y-%m-%d')


def count_down(num):
    """
    倒数计时器，按照指定的秒数原地倒计时刷新数字
    :param num:
    :return:
    """
    count = 0
    while count < num:
        n_count = num - count
        if n_count > 1:
            sys.stdout.write("\r%d" % n_count)
        else:
            sys.stdout.write("\r%d\n" % n_count)
        sys.stdout.flush()
        time.sleep(1)
        count += 1


if __name__ == '__main__':
    print(get_relative_date_str(1))
